/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

import javax.microedition.rms.*;
/**
 *
 * @author Administrator
 */
public class CliDB
{

    private RecordStore rs = null;

    private volatile static CliDB instance = null;

    /** prefix for user name record */
    private static final byte RECORD_EMAIL = 0x01;
    /** prefix for password record */
    private static final byte RECORD_PASSWORD = 0x02;
    /** prefix for city name record */
    private static final byte RECORD_CITYNAME = 0x03;
    /** prefix for city id record */
    private static final byte RECORD_CITYID   = 0x04;
    /** prefix for username id record */
    private static final byte RECORD_USERNAME = 0x05;
    /** prefix for vibration id record */
    private static final byte RECORD_VIBRATION = 0x50;

    private CliDB()
    {
        try
        {
            rs = RecordStore.openRecordStore(Conf.CLI_RS_NAME, true);
        }
        catch(RecordStoreException e)
        {
            System.out.println(e.getMessage());
        }
    }


    public static CliDB getInstance()
    {
        synchronized (CliDB.class) {
            if (instance == null) {
                instance = new CliDB();
            }
        }
        return instance;
    }

    /**
    * return email or null
    * if email not found in record store
    */
    public String getEMail()
    {
        return getString(RECORD_EMAIL);
    }

    /**
    * save email in record store
    */
    public void setEMail(String email)
    {
        setString(RECORD_EMAIL, email);
    }

    /**
    * return password or null
    * if user name not found in record store
    */
    public String getPassword()
    {
        return getString(RECORD_PASSWORD);
    }

    /**
    * save password in record store
    */
    public void setPassword(String password)
    {
        setString(RECORD_PASSWORD, password);
    }

    public String getCity()
    {
        return getString(RECORD_CITYNAME);
    }

    public void setCity(String name)
    {
        setString(RECORD_CITYNAME, name);
    }

    public String getCityID()
    {
        return getString(RECORD_CITYID);
    }

    public void setCityID(String ID)
    {
        setString(RECORD_CITYID, ID);
    }

    public String getUsername()
    {
        return getString(RECORD_USERNAME);
    }

    public void setUsername(String Username)
    {
        setString(RECORD_USERNAME, Username);
    }

    public char getVibration()
    {
        return getString(RECORD_VIBRATION).charAt(0);
    }

    public void setVibration(char Vibration)
    {
        setString(RECORD_VIBRATION, String.valueOf(Vibration));
    }

    /**
    * метод для чтения строки
    * @param criteria константный идентификатор записи
    * @return строка
    */
    private String getString(byte criteria)
    {
        String str = null;

        try
        {
            // выполняем поиск запрашиваемого параметра
            RecordEnumeration re = rs.enumerateRecords(
            new FirstByteFilter(criteria), null, false);

            // если нашли - извлекаем строку из массива
            //  байт пропуская первый байт,
            // т.к. он - идентификатор
            if (re.numRecords() > 0)
            {
                byte[] data = re.nextRecord();
                str = new String(data, 1, data.length - 1, "UTF-8");
            }
        } catch (Exception e)
        {
            System.out.println(e.getClass() +": "+ e.getMessage());
        }

        return str;
    }

    /**
    * метод для сохранения строки
    * если уже существует сторка с данным идентификатором,
    * этот метод заменит ее значение на новое
    * @param criteria идентификатор
    * @param value строка для сохранения
    */
    private void setString(byte criteria, String value)
    {
        try
        {
            // ищем старую запись с данным идентификатором
            RecordEnumeration re = rs.enumerateRecords(
                new FirstByteFilter(criteria), null, false);

            int id = (re.numRecords() > 0) ? re.nextRecordId() : -1;

            // удаляем, если null
            if(value == null)
            {
                if (re.numRecords() > 0) rs.deleteRecord(id);
            }
            else
            {
                // делаем из строки массив байт,
                // с первым байтом идентификатором
                byte[] tmp = value.getBytes("UTF-8");
                byte[] data = new byte[tmp.length + 1];
                data[0] = criteria;
                System.arraycopy(tmp, 0, data, 1, tmp.length);

                // если запись с данным идентификатором уже есть,
                // то заменяем ее значение
                // если нет, то добавляем новую запись
                if (re.numRecords() > 0)
                {
                    rs.setRecord(id, data, 0, data.length);
                }
                else
                {
                    rs.addRecord(data, 0, data.length);
                }
            }
        }
        catch (Exception e)
        {
            System.out.println(e.getClass() +": "+ e.getMessage());
        }
    }


    private class FirstByteFilter implements RecordFilter{

        private byte criteria;

        // инициализируем класс нужным
        // константным идентификатором
        public FirstByteFilter(byte criteria)
        {
            this.criteria = criteria;
        }

        // метод возвращает true, если первый байт записи
        // совпадает с идентификатором
        public boolean matches(byte[] candidate)
        {
            return (candidate[0] == criteria);
        }
    }

}
